// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 进程等。

package os

import (
	"internal/testlog"
	"runtime"
	"syscall"
)

// 参数包含命令行参数，以程序名开头。
var Args []string

func init() {
	if runtime.GOOS == "windows" {
		// 已在exec_windows.go中初始化。
		return
	}
	Args = runtime_args()
}

func runtime_args() []string // 在包运行时

// Getuid返回调用方的数字用户id。
// 
// 在Windows上，它返回-1。
func Getuid() int { return syscall.Getuid() }

// Geteuid返回调用者的有效用户id。在Windows上，它返回-1。
func Geteuid() int { return syscall.Geteuid() }

// Getgid返回调用者的数字组id。在Windows上，它返回-1。
func Getgid() int { return syscall.Getgid() }

// Getegid返回调用者的数字有效组id。在Windows上，它返回-1。
func Getegid() int { return syscall.Getegid() }

// Getgroups返回调用者所属组的数字ID列表。在Windows上，它返回syscall.EWINDOWS。请参阅操作系统/用户软件包
// 以了解可能的替代方案。
func Getgroups() ([]int, error) {
	gids, e := syscall.Getgroups()
	return gids, NewSyscallError("getgroups", e)
}

// 退出导致当前程序以给定的状态代码退出。
// 按照惯例，代码零表示成功，非零表示错误。
// 程序立即终止；延迟函数不运行。
// 
// 为了便于移植，状态代码应在[0，125]范围内。
func Exit(code int) {
	if code == 0 {
		if testlog.PanicOnExit0() {
			// 我们被告知在调用os.Exit（0）时要惊慌失措。
			// 用于使早期
			// 意外调用os.Exit（0）的测试失败。
			panic("unexpected call to os.Exit(0) during test")
		}

		// 给race detector一个程序失败的机会。
		// Racy程序无权成功完成。
		runtime_beforeExit()
	}
	syscall.Exit(code)
}

func runtime_beforeExit() // 在运行时
